Twelve-factor app
次のようなSoftware as a Service を作るための方法論
1. コードベース
バージョン管理されている1つのコードベースと複数のデプロイ
アプリごとに一つのコードベースをバージョン管理システムに載せて管理する
一つのコードベースを基に複数のデプロイ先が存在する
2. 依存関係
依存関係を明示的に宣言し分離する
全ての依存関係を依存関係宣言マニフェストで完全、厳密に宣言する
3. 設定
設定をコードから厳密に分離する
アプリケーション内部の設定は含まない。
バージョン管理システムで管理しない設定ファイルを使う方法もある
4. バックエンドサービス
バックエンドサービスをアタッチされたリソースとして扱う
バックエンドサービスは、アプリケーションが通常の動作の中でネットワーク越しに利用する全てのサービス
データストア、メッセージキューイングシステム、SMTPサーバー、キャッシュシステムなど
ローカルサービスとサードパーティーサービスを区別しない
5. ビルド、リリース、実行
ビルド、リリース、実行の3つのステージを厳密に分離する
コードベースは3つのステージを経てデプロイされる
全てのリリースは常に一意のリリースIDを持つべき
6. プロセス
アプリケーションを1つもしくは複数のステートレスなプロセスとして実行する
ステートレスかつシェアードナッシング
永続化する必要がある全てのデータはステートフルなバックエンドサービスに格納する
7. ポートバインディング
ポートバインディングを通してサービスを公開する
完全に自己完結する
webアプリケーションはポートにバインドすることでHTTPをサービスとして公開する
8. 並行性
プロセスモデルによってスケールアウトする
9. 廃棄容易性
高速な起動とグレイスフルシャットダウンで堅牢性を最大化する
即座に起動/終了できる
Processは起動時間を最小化するように努力するべき
突然の死に対して堅牢であるべき
10. 開発/本番 一致
開発、ステージング、本番環境をできるだけ一致させた状態を保つ
時間のギャップ、人材のギャップ、ツールのギャップがある
継続的デプロイしやすいように、開発環境と本番環境のギャップを小さく保つ
開発と本番の間でことなるバックエンドサービスを使いたくなる衝動に抵抗する
11. ログ
ログをイベントストリームとして扱う
アプリケーションの出力ストリームの送り先やストレージについて一切関知しない
12. 管理プロセス
管理タスクを1回限りのプロセスとして実行する